

const Round =qguan(0,"Round")

const Row =qguan(0,"Row")
const AnalogyChange =qguan(0,"AnalogyChange")
const Instruction =qguan(0,"Instruction")
const Factory =qguan(0,"Factory")


/**
 * 存储 检查
 */
export default class RunOrderRound extends Round{


    /**
     * 数据段
     * 代码段
     * 堆栈段
     * 附加段
     * 寄存器
     */
    constructor(file){
        super();
        this.res=null;
        this.stack=new Round();
        this.code=new Round();
        this.data=file;
        this.codeHand=new Row();
        this.dataHand=new Row();
    }
    /**
     * 111 111 111 0  有条件跳转
     * 111 111 111 1  无条件跳转
     * 111 111 111 2  判断
     * 111 111 111 3  输入
     * 111 111 111 4  输出
     * 111         5  立即数输入
     *             6  空操作
     * 1           7  立即数加
     * 1           8  立即数减
     * 1           10 创建块 入栈
     * 1           11 创建行
     *  1          12  内调
     *            13  入栈
     *            14  读取指令指针
     *            15 外调
     * 1           16 删除行
     * 1           17 删除块
     * 1           18 读取代码段
     * 1           19 写入代码段
     * 1           20 读取数据段
     * 1           21 写入数据段
     * 1           22 修改输出状态
     *
     */

    run(ambient){

        this.ambient=ambient;

        this.ftTree(0);
        this.runInstrcution()
        Factory.findIn(this)

    }

    /**
     * 合并任务
     * @param file
     */
    mergeTask(file){

    }

    /**
     * 输出
     */
    out(){

    }

    /**
     * 回调
     */
    callback(){

    }


    /**
     * 遍历树
     * @param w
     * @returns {Array}
     */
    ftTree (w) {
        if (this.list[0].list[w].find(1) == null) {

           let id=   this.list[0].list[w].find(4)
            this._ifRun(id)
            if (this.list[0].list[w].find(2) != null) {
               this.ftTree(this.list[0].list[w].find(2));
            }
        } else {
            let id=   this.list[0].list[w].find(4)
            this._ifRun(id)
            this.ftTree(this.list[0].list[w].find(1));
            if (this.list[0].list[w].find(2)  != null) {
                 this.ftTree(this.list[0].list[w].find(2) );
            }
        }
    }

    /**
     * 判断是否是可执行模块
     * @param m
     * @private
     */
    _ifRun(m){
      let row=      this.list[m].list[0];
      let isRun=  row.find(3);
      if(isRun=='1'){
          let codeId=  row.find(3);
          this.runInstrcution(codeId)
      }
        return;

    }

    runInstrcution(codeId){
     let core= Core.instance();
        let codeBocik=core.findReal(null,'44');
        let codeRound=AnalogyChange.toRound(codeBocik);
        let ins=new Instruction(codeRound,this);
        ins.run();
    }

    saveOutType(_type){
    }
}